[IA64] remove unnecessary vtlb_lock
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 19 Jun 2006 19:13:01 +0000 (13:13 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 19 Jun 2006 19:13:01 +0000 (13:13 -0600)
remove vtlb_lock.
As Tristan pointed out, vtlb_lock is unnecesary.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/domain.c
xen/arch/ia64/xen/faults.c
xen/arch/ia64/xen/vhpt.c
xen/include/asm-ia64/domain.h

index e42b3249debec9281ef24fd81a6b735f1f2bcacf..535eb7aa193069c09113b1b6a81eb2b5da51e25a 100644 (file)
@@ -306,7 +306,6 @@ int arch_domain_create(struct domain *d)
        // the following will eventually need to be negotiated dynamically
        d->arch.shared_info_va = SHAREDINFO_ADDR;
        d->arch.breakimm = 0x1000;
-       seqlock_init(&d->arch.vtlb_lock);
 
        if (is_idle_domain(d))
            return 0;
index c8e51d5e9a11d5e31c98892fe00375555379c813..dfda9af4d7269130da6f2335e9744f977c867bef 100644 (file)
@@ -214,8 +214,6 @@ void ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_reg
        // FIXME should validate address here
        unsigned long pteval;
        unsigned long is_data = !((isr >> IA64_ISR_X_BIT) & 1UL);
-       seqlock_t* vtlb_lock = &current->domain->arch.vtlb_lock;
-       unsigned long seq;
        IA64FAULT fault;
 
        if ((isr & IA64_ISR_IR) && handle_lazy_cover(current, regs)) return;
@@ -232,14 +230,16 @@ void ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_reg
        }
 
  again:
-       seq = read_seqbegin(vtlb_lock);
        fault = vcpu_translate(current,address,is_data,&pteval,&itir,&iha);
        if (fault == IA64_NO_FAULT || fault == IA64_USE_TLB) {
                u64 logps;
                struct p2m_entry entry;
                pteval = translate_domain_pte(pteval, address, itir, &logps, &entry);
                vcpu_itc_no_srlz(current,is_data?2:1,address,pteval,-1UL,logps);
-               if (read_seqretry(vtlb_lock, seq) || p2m_entry_retry(&entry)) {
+               if ((fault == IA64_USE_TLB && !current->arch.dtlb.pte.p) ||
+                   p2m_entry_retry(&entry)) {
+                       /* dtlb has been purged in-between.  This dtlb was
+                          matching.  Undo the work.  */
                        vcpu_flush_tlb_vhpt_range(address & ((1 << logps) - 1),
                                                  logps);
                        goto again;
index b0cb6547e99c8f914526b9f63277bb1be25e7c73..0d037fdb2575f8f0434314d0cfcf3d5f04cb713c 100644 (file)
@@ -152,9 +152,7 @@ void domain_flush_vtlb_all (void)
 {
        int cpu = smp_processor_id ();
        struct vcpu *v;
-       seqlock_t* vtlb_lock = &current->domain->arch.vtlb_lock;
 
-       write_seqlock(vtlb_lock);
        for_each_vcpu (current->domain, v)
                if (v->processor == cpu)
                        vcpu_flush_vtlb_all ();
@@ -163,7 +161,6 @@ void domain_flush_vtlb_all (void)
                                (v->processor,
                                 (void(*)(void *))vcpu_flush_vtlb_all,
                                 NULL,1,1);
-       write_sequnlock(vtlb_lock);
 }
 
 static void cpu_flush_vhpt_range (int cpu, u64 vadr, u64 addr_range)
@@ -190,7 +187,6 @@ void vcpu_flush_tlb_vhpt_range (u64 vadr, u64 log_range)
 
 void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range)
 {
-       seqlock_t* vtlb_lock = &d->arch.vtlb_lock;
        struct vcpu *v;
 
 #if 0
@@ -201,7 +197,6 @@ void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range)
        }
 #endif
 
-       write_seqlock(vtlb_lock);
        for_each_vcpu (d, v) {
                /* Purge TC entries.
                   FIXME: clear only if match.  */
@@ -218,7 +213,6 @@ void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range)
 
        /* ptc.ga  */
        ia64_global_tlb_purge(vadr,vadr+addr_range,PAGE_SHIFT);
-       write_sequnlock(vtlb_lock);
 }
 
 static void flush_tlb_vhpt_all (struct domain *d)
@@ -230,8 +224,6 @@ static void flush_tlb_vhpt_all (struct domain *d)
        local_flush_tlb_all ();
 }
 
-// this is called when a domain is destroyed
-// so that there is no race.
 void domain_flush_destroy (struct domain *d)
 {
        /* Very heavy...  */
@@ -241,10 +233,8 @@ void domain_flush_destroy (struct domain *d)
 
 void flush_tlb_mask(cpumask_t mask)
 {
-    seqlock_t* vtlb_lock = &current->domain->arch.vtlb_lock;
     int cpu;
 
-    write_seqlock(vtlb_lock);
     cpu = smp_processor_id();
     if (cpu_isset (cpu, mask)) {
         cpu_clear(cpu, mask);
@@ -252,13 +242,11 @@ void flush_tlb_mask(cpumask_t mask)
     }
 
     if (cpus_empty(mask))
-        goto out;
+        return;
 
     for_each_cpu_mask (cpu, mask)
         smp_call_function_single
             (cpu, (void (*)(void *))flush_tlb_vhpt_all, NULL, 1, 1);
-out:
-    write_sequnlock(vtlb_lock);
 }
 
 void zero_vhpt_stats(void)
index 6238033d71dead83c86c6f368965a1bf751ce21b..ceb5e890e9ba3863f54713d584d7dfa40c6a6142 100644 (file)
@@ -98,9 +98,6 @@ struct arch_domain {
     void *efi_runtime;
     /* Metaphysical address to fpswa_interface_t in domain firmware memory is set. */
     void *fpswa_inf;
-
-    // protect v->itlb, v->dtlb and vhpt
-    seqlock_t   vtlb_lock ____cacheline_aligned_in_smp;
 };
 #define INT_ENABLE_OFFSET(v)             \
     (sizeof(vcpu_info_t) * (v)->vcpu_id + \